// 主席树 O(nlognlogn)
#define N 200005
#define lc(x) tr[x].l
struct node{
  int l,r,s; //s:节点值域中有多少个数
}tr[N*20];
int root[N],idx;
int n,m,a[N],b[N];
void insert(int x,int &y,int l,int r,int pos)
{
    y = ++idx; //开点
    tr[y] = tr[x]; tr[y].s ++;
    if(l == r) return;
    int m = l + r >> 1;
    if(pos <= m) insert(tr[x].l,tr[y].l,l,m,pos);
    else insert(tr[x].r,tr[y].r,m + 1,r,pos);
}
int query(int x,int y,int l,int r,int k)
{
    if(l == r) return l;
    int m = l + r >> 1;
    int s = tr[tr[y].l].s-tr[tr[x].l].s;
    if(k <= s) return query(tr[x].l,tr[y].l,l,m,k);
    else return query(tr[x].r,tr[y].r,m + 1,r,k - s);
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i = 1; i <= n; i ++)
    {
        scanf("%d",&a[i]); b[i] = a[i];
    }
    sort(b + 1,b + n + 1);
    int bn = unique(b + 1,b + n + 1) - b - 1; //去重后的个数

    for(int i = 1; i <= n; i ++){
    int id=lower_bound(b + 1,b + bn + 1,a[i]) - b;//下标
    insert(root[i - 1],root[i],1,bn,id);
    }
    while(m--)
    {
        int l,r,k; scanf("%d%d%d",&l,&r,&k);
        int id = query(root[l-1],root[r],1,bn,k);
        printf("%d\n",b[id]);
    }
}